package com.xhdx.threadpool.tools;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {
    public static void main(String[] args) {

        // 思想：只有各个子任务都完成了采取执行下一步，如果有线程提前完成则等待
        ExecutorService threadPool = Executors.newCachedThreadPool();
        // 规定总的任务量：只有全部完成才会进行下一步处理
        CyclicBarrier cb = new CyclicBarrier(3);

        for (int i = 0; i < 6; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println(
                                Thread.currentThread().getName() + ":完成分任务,剩余任务：" + (2 - cb.getNumberWaiting()));

                        // 如果前面2个线程阻塞 + 正在运行的线程 = 3，表明总任务完成
                        if (cb.getNumberWaiting() == 2) {
                            System.out.println("恭喜，总任务已完成！");
                        }
                        // 分任务完成则等待,直到搜索的任务都完成,才执行await后面的代码
                        cb.await();
                        System.out.println(Thread.currentThread().getName() +":ok");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        threadPool.shutdown();
    }
}